home *** CD-ROM | disk | FTP | other *** search
/ Floppyshop 2 / Floppyshop - 2.zip / Floppyshop - 2.iso / diskmags / 0022-3.564 / dmg-3133 / programs / menu.lst < prev   
File List  |  1992-01-11  |  8KB  |  400 lines

  1. ' Stef's menu routine
  2. '
  3. ' groundwork created 13.10.91
  4. ' finished 19.10.91
  5. ' two days of work!
  6. '
  7. DEFFILL 1,2,4
  8. PBOX 0,0,639,399
  9. '
  10. menu_init
  11. menu_read
  12. menu_bar
  13. menu_handle
  14. '
  15. > PROCEDURE menu_init
  16.   LOCAL mem%
  17.   '
  18.   SELECT XBIOS(4)
  19.   CASE 2
  20.     fh%=16
  21.     fw%=8
  22.     fc%=2
  23.     sh%=399
  24.     sw%=639
  25.     mem%=32000
  26.     fnt%=13
  27.   CASE 1
  28.     fh%=8
  29.     fw%=8
  30.     fc%=1
  31.     sh%=199
  32.     sw%=639
  33.     mem%=32000
  34.     fnt%=6
  35.   CASE 0
  36.     fh%=8
  37.     fw%=8
  38.     fc%=1
  39.     sh%=199
  40.     sw%=319
  41.     mem%=32000
  42.     fnt%=6
  43.   ENDSELECT
  44.   '
  45.   IF FRE(0)>mem%
  46.     m_back!=TRUE
  47.   ELSE
  48.     m_back!=FALSE
  49.   ENDIF
  50.   DEFTEXT ,,,fnt%
  51. RETURN
  52. > PROCEDURE menu_read
  53.   LOCAL x$,i%,j%,k%,x%,max%
  54.   '
  55.   RESTORE menu_data
  56.   m_menus%=0
  57.   m_items%=0
  58.   m_sub%=-1
  59.   '
  60.   READ x$,i%
  61.   WHILE i%<>1002
  62.     INC m_items%
  63.     IF i%=1000
  64.       INC m_menus%
  65.     ENDIF
  66.     IF i%=1003
  67.       IF m_sub%=-1
  68.         m_sub%=m_menus%+1
  69.       ELSE
  70.         INC m_sub%
  71.       ENDIF
  72.     ENDIF
  73.     READ x$,i%
  74.   WEND
  75.   DEC m_menus%
  76.   DEC m_sub%
  77.   '
  78.   DIM m_item$(m_items%)
  79.   DIM m_item%(m_items%)
  80.   DIM m_menu%(m_sub%,9)
  81.   DIM m_back$(m_sub%,1)
  82.   '
  83.   RESTORE menu_data
  84.   FOR i%=0 TO m_items%-1
  85.     READ m_item$(i%),m_item%(i%)
  86.     IF m_item%(i%)=1000 OR m_item%(i%)=1003
  87.       m_menu%(j%,4)=i%+1
  88.       INC j%
  89.     ENDIF
  90.   NEXT i%
  91.   '
  92.   x%=fw%*2-2
  93.   max%=-1
  94.   j%=0
  95.   k%=0
  96.   FOR i%=0 TO m_items%-1
  97.     IF m_item%(i%)=1000 OR m_item%(i%)=1003
  98.       IF max%>-1
  99.         m_menu%(j%,0)=x%
  100.         m_menu%(j%,1)=fh%+2
  101.         m_menu%(j%,2)=x%+max%*fw%+2+fw%*2
  102.         m_menu%(j%,3)=m_menu%(j%,1)+k%*fh%+1
  103.         m_menu%(j%,5)=FALSE
  104.         m_menu%(j%,6)=(LEN(m_item$(m_menu%(j%,4)-1))+2)*fw%+1
  105.         IF m_item%(i%)=1000
  106.           m_menu%(j%,7)=k%-1
  107.         ELSE
  108.           m_menu%(j%,7)=k%
  109.         ENDIF
  110.         m_menu%(j%,8)=-1
  111.         m_menu%(j%,9)=-1
  112.         ADD x%,m_menu%(j%,6)-1
  113.         INC j%
  114.       ENDIF
  115.       max%=0
  116.       k%=0
  117.     ELSE
  118.       max%=MAX(max%,LEN(m_item$(i%)))
  119.       INC k%
  120.     ENDIF
  121.   NEXT i%
  122.   m_menu%(j%,0)=x%
  123.   m_menu%(j%,1)=fh%+2
  124.   m_menu%(j%,2)=x%+max%*fw%+2+fw%*2
  125.   m_menu%(j%,3)=m_menu%(j%,1)+k%*fh%+1
  126.   m_menu%(j%,5)=FALSE
  127.   m_menu%(j%,6)=(LEN(m_item$(m_menu%(j%,4)-1))+2)*fw%+1
  128.   m_menu%(j%,7)=k%
  129.   m_menu%(j%,8)=-1
  130.   m_menu%(j%,9)=-1
  131. RETURN
  132. > PROCEDURE menu_bar
  133.   LOCAL i%
  134.   '
  135.   DEFFILL 1,0,0
  136.   BOUNDARY 0
  137.   PBOX 0,0,sw%,fh%+1
  138.   FOR i%=0 TO m_menus%
  139.     TEXT m_menu%(i%,0)+2+fw%,fh%-fc%,m_item$(m_menu%(i%,4)-1)
  140.   NEXT i%
  141.   LINE 0,fh%+2,sw%,fh%+2
  142.   m_state%=0
  143.   m_m%=-1
  144.   m_i%=-1
  145. RETURN
  146. > PROCEDURE menu_handle
  147.   LOCAL x%,y%,k%,k1%,k!
  148.   '
  149.   MOUSE x1%,y1%,k%
  150.   menu_check(m_m%,x1%,y1%,k%)
  151.   DO
  152.     SHOWM
  153.     k!=FALSE
  154.     k1%=0
  155.     REPEAT
  156.       MOUSE x%,y%,k%
  157.       IF k%=2
  158.         EDIT
  159.       ENDIF
  160.       IF k%=0
  161.         k!=TRUE
  162.       ENDIF
  163.       IF k!
  164.         k1%=k%
  165.       ENDIF
  166.     UNTIL x%<>x1% OR y%<>y1% OR k1%
  167.     x1%=x%
  168.     y1%=y%
  169.     menu_check(m_m%,x%,y%,k1%)
  170.   LOOP
  171. RETURN
  172. > PROCEDURE menu_check(m%,x%,y%,k%)
  173.   LOCAL i%,mx1%,mx2%,m_m1%,m_sm!,m_im%
  174.   '
  175.   m_sm!=FALSE
  176.   IF y%<fh%+2
  177.     m_m1%=-1
  178.     FOR i%=0 TO m_menus%
  179.       mx1%=m_menu%(i%,0)+2
  180.       mx2%=mx1%+m_menu%(i%,6)
  181.       IF x%>=mx1% AND x%<=mx2%
  182.         m_m1%=i%
  183.         m_sm!=TRUE
  184.       ENDIF
  185.     NEXT i%
  186.     IF m_m1%>-1 AND m_m1%<>m%
  187.       menu_delete(m%)
  188.       m_m%=m_m1%
  189.       menu_inv1(m_m%)
  190.       menu_draw(m_m%,FALSE)
  191.     ENDIF
  192.   ENDIF
  193.   '
  194.   m_im%=-1
  195.   menu_item(m%,x%,y%)
  196.   WHILE m%<>m_m%
  197.     m%=m_m%
  198.     menu_item(m%,x%,y%)
  199.   WEND
  200.   '
  201.   IF m%>-1 AND m_im%=-1
  202.     m%=m_menu%(m%,8)
  203.     WHILE m%>-1
  204.       menu_item(m%,x%,y%)
  205.       m%=m_menu%(m%,8)
  206.     WEND
  207.   ENDIF
  208.   '
  209.   IF k% AND m_sm!=FALSE AND (m_m%=m_im% OR m_im%=-1)
  210.     menu_delete(m_m%)
  211.     IF m%>-1
  212.       IF m_menu%(m%,9)>-1
  213.         ALERT 1," OPTION VALUE: "+STR$(m_item%(m_menu%(m%,9)+m_menu%(m%,4))),1," OK ",button%
  214.       ENDIF
  215.     ENDIF
  216.   ENDIF
  217. RETURN
  218. > PROCEDURE menu_item(m%,x%,y%)
  219.   LOCAL m_i1%,m_m1%,i%
  220.   '
  221.   IF m%>-1
  222.     i%=m_menu%(m%,9)
  223.     IF x%>m_menu%(m%,0) AND x%<m_menu%(m%,2) AND y%>m_menu%(m%,1) AND y%<m_menu%(m%,3)
  224.       m_i1%=(y%-m_menu%(m%,1)-1)/fh%
  225.       m_im%=m%
  226.       IF m_item%(m_i1%+m_menu%(m%,4))=1001
  227.         m_i1%=-1
  228.       ENDIF
  229.     ELSE
  230.       m_i1%=-1
  231.     ENDIF
  232.     '
  233.     f!=FALSE
  234.     IF m_i1%<>i%
  235.       IF m_i1%>-1
  236.         WHILE m%<>m_m%
  237.           f!=TRUE
  238.           menu_erase(m_m%)
  239.         WEND
  240.       ENDIF
  241.       IF m%=m_m%
  242.         menu_inv2(m%,i%)
  243.         i%=m_i1%
  244.         m_menu%(m%,9)=m_i1%
  245.       ENDIF
  246.       menu_inv2(m%,m_i1%)
  247.       '
  248.       ' check for cascading menu
  249.       '
  250.       IF i%>-1 AND m%=m_m%
  251.         m_m1%=m_item%(i%+m_menu%(m%,4))
  252.         IF m_m1%<0
  253.           m_m1%=-m_m1%+m_menus%
  254.           menu_draw(m_m1%,TRUE)
  255.           m_m%=m_m1%
  256.         ENDIF
  257.       ENDIF
  258.     ENDIF
  259.   ENDIF
  260. RETURN
  261. > PROCEDURE menu_delete(m%)
  262.   REPEAT
  263.     menu_inv1(m%)
  264.     menu_erase(m%)
  265.     IF m%>-1
  266.       m%=m_menu%(m%,8)
  267.     ENDIF
  268.   UNTIL m%=-1
  269. RETURN
  270. > PROCEDURE menu_draw(m%,sub!)
  271.   LOCAL x%,y%,mw%,w%
  272.   '
  273.   IF sub!
  274.     mw%=m_menu%(m%,2)-m_menu%(m%,0)
  275.     m_menu%(m%,0)=m_menu%(m_m%,2)-fw%
  276.     m_menu%(m%,1)=m_menu%(m_m%,1)+i%*fh%+fh%/2
  277.     m_menu%(m%,2)=m_menu%(m%,0)+mw%
  278.     m_menu%(m%,3)=m_menu%(m%,1)+m_menu%(m%,7)*fh%+1
  279.     m_menu%(m%,8)=m_m%
  280.     IF m_menu%(m%,2)>sw%
  281.       m_menu%(m%,0)=sw%-mw%
  282.       m_menu%(m%,2)=sw%
  283.     ENDIF
  284.   ELSE
  285.     m_menu%(m%,8)=-1
  286.   ENDIF
  287.   m_menu%(m%,9)=-1
  288.   '
  289.   GET m_menu%(m%,0),m_menu%(m%,1),m_menu%(m%,2),m_menu%(m%,3),m_back$(m%,1)
  290.   IF m_menu%(m%,5)
  291.     PUT m_menu%(m%,0),m_menu%(m%,1),m_back$(m%,0)
  292.   ELSE
  293.     DEFFILL 1,0,0
  294.     BOUNDARY 1
  295.     PBOX m_menu%(m%,0),m_menu%(m%,1),m_menu%(m%,2),m_menu%(m%,3)
  296.     x%=m_menu%(m%,0)+2
  297.     y%=m_menu%(m%,1)+fh%-fc%
  298.     mw%=(m_menu%(m%,2)-m_menu%(m%,0)-4)/fw%+1
  299.     '
  300.     FOR i%=m_menu%(m%,4) TO m_menu%(m%,4)+m_menu%(m%,7)
  301.       IF m_item%(i%)<>1003
  302.         IF m_item%(i%)=1001
  303.           DEFTEXT ,2,,fnt%
  304.           TEXT x%,y%,m_item$(i%)+STRING$(mw%-LEN(m_item$(i%)),LEFT$(m_item$(i%)))
  305.           DEFTEXT ,0,,fnt%
  306.         ELSE
  307.           IF m_item%(i%)<0 AND LEN(m_item$(i%))<mw%-2
  308.             m_item$(i%)=m_item$(i%)+STRING$(mw%-LEN(m_item$(i%))-2," ")+"»"
  309.           ENDIF
  310.           TEXT x%+fw%,y%,m_item$(i%)
  311.         ENDIF
  312.         ADD y%,fh%
  313.       ENDIF
  314.     NEXT i%
  315.     IF m_back!
  316.       GET m_menu%(m%,0),m_menu%(m%,1),m_menu%(m%,2),m_menu%(m%,3),m_back$(m%,0)
  317.       m_menu%(m%,5)=TRUE
  318.     ENDIF
  319.   ENDIF
  320. RETURN
  321. > PROCEDURE menu_erase(m%)
  322.   IF m%>-1
  323.     BOUNDARY 0
  324.     DEFFILL 1,2,4
  325.     PUT m_menu%(m%,0),m_menu%(m%,1),m_back$(m%,1)
  326.     DEFFILL 1,1,0
  327.     m_m%=m_menu%(m%,8)
  328.   ENDIF
  329.   SHOWM
  330. RETURN
  331. > PROCEDURE menu_inv1(m%)
  332.   IF m%>-1
  333.     IF m_menu%(m%,8)=-1
  334.       DEFFILL 1,1,0
  335.       GRAPHMODE 3
  336.       BOUNDARY 0
  337.       PBOX m_menu%(m%,0)+2,0,m_menu%(m%,0)+m_menu%(m%,6),fh%+1
  338.       GRAPHMODE 1
  339.       SHOWM
  340.     ENDIF
  341.   ENDIF
  342. RETURN
  343. > PROCEDURE menu_inv2(m%,i%)
  344.   IF i%>-1
  345.     DEFFILL 1,1,0
  346.     GRAPHMODE 3
  347.     BOUNDARY 0
  348.     PBOX m_menu%(m%,0)+1,m_menu%(m%,1)+i%*fh%+1,m_menu%(m%,2)-1,m_menu%(m%,1)+(i%+1)*fh%
  349.     GRAPHMODE 1
  350.     SHOWM
  351.   ENDIF
  352. RETURN
  353. > PROCEDURE menu_data
  354. menu_data:
  355.   DATA Menu1,1000
  356.   DATA Item 1.1,0
  357.   DATA Item 1.2,1
  358.   DATA -,1001
  359.   DATA Submenu 1,-1
  360.   DATA Item 1.3,2
  361.   '
  362.   DATA Menu 2,1000
  363.   DATA Item 2.1,3
  364.   DATA Item 2.2,4
  365.   DATA Another terrific item!,20
  366.   DATA ≡ XYZ ≡,1001
  367.   DATA Itemoid 2.3,5
  368.   DATA Item 2.4,6
  369.   DATA Item 2.5,7
  370.   '
  371.   DATA En menu 3!,1000
  372.   DATA Item 3.1,8
  373.   DATA Item 3.2,9
  374.   DATA - XYZ -,1001
  375.   DATA Itemette 3.3,10
  376.   '
  377.   DATA Submenu,1003
  378.   DATA Cascade option 1,20
  379.   DATA - Cascade heaven -,1001
  380.   DATA ANOTHER ONE!!,-2
  381.   DATA Cascade 3,-3
  382.   '
  383.   DATA Submenu,1003
  384.   DATA "yes, another one",23
  385.   DATA what a load of bollocks,24
  386.   '
  387.   DATA Submenu,1003
  388.   DATA Ah yeah,25
  389.   DATA Wonderful stuff,26
  390.   DATA Why not?,-4
  391.   DATA Item number 27,27
  392.   DATA Lovely,28
  393.   '
  394.   DATA Submenu,1003
  395.   DATA Great,29
  396.   DATA Last one,30
  397.   '
  398.   DATA END,1002
  399. RETURN
  400.